package code.c01_introduction.classwork;

/**
 * @author thinkpad - 83start
 * @version v1.0
 * @create 2022/9/9 16:40
 * @package code.list.introduction
 * @description 文件说明
 */

public class SetTest{
    public static void main(String[] args) {
        Set<Integer> s1,s2,s3,s4,s5;
        TwoSet<Integer> t = new TwoSet<>();
        s1 = new Set<>();
        s1.add(1);
        s1.add(3);
        s1.add(4);
        s1.add(6);
        s1.add(7);
        System.out.println("集合s1:");
        s1.display();

        s2 = new Set<>();
        s2.add(2);
        s2.add(8);
        s2.add(5);
        s2.add(9);
        s2.add(7);
        System.out.println("集合s2:");
        s2.display();

        System.out.println("集合s1 和 s2 的并集 -> s3:");
        s3 = t.Union(s1,s2);
        s3.display();

        System.out.println("集合s1 和 s2 的差集 -> s4:");
        s4 = t.Difference(s1,s2);
        s4.display();

        System.out.println("集合s1 和 s2 的交集 -> s5:");
        s5 = t.Intersection(s1, s2);
        s5.display();
    }
}



class Set<E> { // 定义集合泛型类
    // 集合中最多的元素个数
    final  int MAX_SIZE = 100;

    // 存放集合的元素
    E[] data;

    // 集合的长度
    int size;

    public Set(){
        //  创建数组、调用构造方式时候需要指定明确的数据类型，不能使用泛型，所以需要用 根类型 转换
        data = (E[])new Object[MAX_SIZE];
        size = 0;
    }

    /**
     * 返回集合的长度
     * @return
     */
    public int getsize(){
        return size;
    }

    /**
     * 返回集合的第 i 个元素
     * @param i
     * @return
     */
    public E get(int i){
        return (E)data[i];
    }

    /**
     * 判断元素是否再集合中
     * @param e
     * @return
     */
    public boolean IsIn(E e){
        for (int i = 0; i < size; i++) {
            if (data[i] == e){
                return true;
            }
        }
        return false;
    }

    /**
     * 将元素添加到集合中
     * @param e
     * @return
     */
    public boolean add(E e){
        // 如果元素已经存在，则直接返回false
        if (IsIn(e)){
            return false;
        }else {
            data[size] = e;
            size++;
            return true;
        }
    }

    public boolean delete(E e){
        int i = 0;
        // 遍历数组，找到被找到元素的下标
        while (i < size && data[i] != e){
            i++;
        }
        if (i>= size){
            return false;
        }
        for (int j = i +1; j < size; j++) {
            data[j -1] = data[j];
        }
        size --;

        return true;
    }

    /**
     * 输出集合中元素
     */
    public void display(){
        for (int i = 0; i < size; i++) {
            if (i ==0 ){
                System.out.print(data[i]);
            }else {
                System.out.print(" " + data[i]);
            }
        }
        System.out.println();
    }
}

class TwoSet<E>{
    // 存放集合的元素
    E[] data;

    /**
     * 完成两个集合的合并操作 s3 = s1 ∪ s2
     * @param s1
     * @param s2
     * @return
     */
    public Set<E> Union(Set<E> s1,Set<E> s2){
        Set<E> s3 = new Set<>();
        for (int i = 0; i < s1.getsize(); i++) {
            s3.add(s1.get(i));
        }

        for (int i = 0; i < s2.getsize(); i++) {
            if (!s1.IsIn(s2.get(i))){
                s3.add(s2.get(i));
            }
        }

        return s3;
    }

    /**
     * 求两个集合的交的部分 s3 = s1 ∩ s2
     * @param s1
     * @param s2
     * @return
     */
    public Set<E> Intersection(Set<E> s1,Set<E> s2){
        Set<E> s3 = new Set<>();

        for (int i = 0; i < s1.getsize(); i++) {
            if (s2.IsIn(s1.get(i))){
                s3.add(s1.get(i));
            }
        }

        return s3;
    }

    /**
     * 求 s3 = s1 - s2
     * @param s1
     * @param s2
     * @return
     */
    public Set<E> Difference(Set<E> s1,Set<E> s2){
        Set<E> s3 = new Set<>();

        for (int i = 0; i < s1.getsize(); i++) {
            if (!s2.IsIn(s1.get(i))){
                s3.add(s1.get(i));
            }
        }

        return s3;
    }

}
